#include "CircleQueue.h"
#include <stdlib.h>
#include <stdio.h>


/*
	初始化一个循环队列并返回队列的地址
*/
struct CqQueue *InitQueue()
{
	struct CqQueue *c =(struct CqQueue *)malloc(sizeof(*c));
	c->cur_len = 0;
	c->front = 0;
	c->rear = 0;

	return c;	
}
/*
	DestroyQueue：销毁一个队列
*/
struct CqQueue * DestroyQueue(struct CqQueue * c)
{
	if(c)
	{
		free(c);
		return NULL;
	}
}
/*
	ClearQueue:清空一个队列
*/
void ClearQueue(struct CqQueue * c)
{
	if(c)
	{
		c->cur_len = 0;
		c->front = 0;
		c->rear = 0;
	}
}
/*
	返回队列中的元素个数
*/
int QueueLength(struct CqQueue * c)
{
	if(c)
	{
		return c->cur_len;
	}
}
/*
	GetHead：返回队头元素值
*/
Datatype GetHead(struct CqQueue * c)
{
	if(c)
	{
		return c->Cq[c->front];
	}
	
}

/*
	QueueIsEmpty:判断一个队列是否为空  为空返回1 不为空返回0
*/
int QueueIsEmpty(struct CqQueue * c)
{
	if(c)
	{
		return c->cur_len == 0;
	}

	return -1;
}

/*
	EnQueue：入队 
		返回值:成功返回1  失败返回0
*/
int EnQueue(struct CqQueue * c, Datatype d)
{
	if(c)
	{
		if((c->rear+1)%QUEUE_MAX_LENGTH == c->front)//队列为满
		{
			printf("the queue is full!!\n");
			return 0;
		}
		c->Cq[c->rear] = d;
		c->rear = (c->rear+1)%QUEUE_MAX_LENGTH;
		c->cur_len++;

		return 1;
	}

	return 0;
}
/*
	DeQueue:出队 
		返回值: 0 表示无出队元素
*/
Datatype DeQueue(struct CqQueue * c)
{
	if(c)
	{
		if(c->front == c->rear)//队列为空
		{
			printf("the Queue is empty!!\n");
			return NULL;
		}
		c->cur_len--;
		Datatype val = c->Cq[c->front];//记录要出队的元素的值 
		c->front = (c->front+1)%QUEUE_MAX_LENGTH;

		return val;
	}

	return NULL;
}

